using UnityEngine;
using UnityEngine.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using CircularScrollView;
using UI.BankingPanel.Data;

namespace UI.BankingPanel.Components
{
    /// <summary>
    /// 风险数据滚动列表组件
    /// 负责显示所有49个号码的风险值列表，用于庄家风险分析
    /// 
    /// 主要功能：
    /// 1. 显示所有49个号码的风险值（按风险值排序，亏损大的在前）
    /// 2. 高风险号码颜色警告显示
    /// 3. 实时更新风险数据
    /// 4. 提供点击选择功能查看详细信息
    /// 5. 支持自定义排序规则
    /// 
    /// 使用方法：
    /// 1. Initialize() - 初始化组件
    /// 2. SetRiskDataList() - 设置风险数据源
    /// 3. SetSortType() - 设置排序方式
    /// 4. RefreshRiskData() - 刷新风险数据
    /// </summary>
    public class C_RiskData_ScrollView : MonoBehaviour
    {
        [Header("滚动列表组件")]
        [SerializeField] private EnhancedUICircularScrollView m_ScrollView;
        
        [Header("列表项模板")]
        [SerializeField] private GameObject m_ItemTemplate;
        
        [Header("配置参数")]
        [SerializeField] private float m_ItemSpacing = 5f;           // 列表项间距
        [SerializeField] private int m_PreloadCount = 10;            // 预加载数量
        [SerializeField] private float m_RiskThreshold = -5000f;     // 风险阈值
        [SerializeField] private bool m_AutoSort = true;             // 自动排序
        
        [Header("排序配置")]
        [SerializeField] private RiskSortType m_SortType = RiskSortType.ByRiskValue;  // 排序类型
        [SerializeField] private bool m_SortDescending = false;      // 降序排列（风险值从低到高，亏损大的在前）
        
        // 数据相关
        private List<NumberBetData> m_OriginalDataList;              // 原始数据列表
        private List<NumberBetData> m_FilteredDataList;              // 过滤后的数据列表
        private Action<NumberBetData> m_OnItemSelected;              // 项目选择回调
        
        // 组件状态
        private bool m_IsInitialized = false;
        
        /// <summary>
        /// 风险排序类型
        /// </summary>
        public enum RiskSortType
        {
            ByNumber,       // 按号码排序
            ByEatCode,      // 按吃码数量排序
            ByRiskValue     // 按风险值排序
        }
        
        #region 初始化方法
        
        /// <summary>
        /// 初始化滚动列表
        /// </summary>
        /// <param name="onItemSelected">项目选择回调</param>
        public void Initialize(Action<NumberBetData> onItemSelected = null)
        {
            if (m_IsInitialized) 
            {
                Debug.Log("[C_RiskData_ScrollView] 已经初始化过了，跳过");
                return;
            }
            
            Debug.Log("[C_RiskData_ScrollView] 开始初始化...");
            m_OnItemSelected = onItemSelected;
            
            // 自动查找组件
            FindComponents();
            
            // 配置滚动列表
            ConfigureScrollView();
            
            // 初始化滚动列表
            InitializeScrollView();
            
            m_IsInitialized = true;
            Debug.Log("[C_RiskData_ScrollView] 初始化完成");
        }
        
        /// <summary>
        /// 自动查找UI组件
        /// </summary>
        private void FindComponents()
        {
            Debug.Log("[C_RiskData_ScrollView] 开始查找组件...");
            
            // 查找滚动列表组件
            if (m_ScrollView == null)
            {
                // 先尝试从子对象查找
                m_ScrollView = GetComponentInChildren<EnhancedUICircularScrollView>();
                
                // 如果没找到，尝试添加到当前对象
                if (m_ScrollView == null)
                {
                    Debug.Log("[C_RiskData_ScrollView] 未找到EnhancedUICircularScrollView组件，尝试添加到当前对象");
                    m_ScrollView = gameObject.AddComponent<EnhancedUICircularScrollView>();
                }
                
                Debug.Log($"[C_RiskData_ScrollView] 滚动列表组件: {(m_ScrollView != null ? "找到/已添加" : "未找到")}");
            }
            
            // 查找列表项模板 - C_RiskData_Item
            if (m_ItemTemplate == null)
            {
                Debug.Log($"[C_RiskData_ScrollView] 当前节点: {transform.name}, 父节点: {(transform.parent != null ? transform.parent.name : "null")}");
                
                // 从父节点查找同级的C_RiskData_Item节点
                Transform parent = transform.parent;
                if (parent != null)
                {
                    Transform itemTemplate = parent.Find("C_RiskData_Item");
                    if (itemTemplate != null)
                    {
                        m_ItemTemplate = itemTemplate.gameObject;
                        Debug.Log($"[C_RiskData_ScrollView] 从父节点找到模板: {itemTemplate.name}");
                    }
                    else
                    {
                        Debug.Log($"[C_RiskData_ScrollView] 父节点下未找到C_RiskData_Item，父节点子对象列表:");
                        for (int i = 0; i < parent.childCount; i++)
                        {
                            Debug.Log($"  - {parent.GetChild(i).name}");
                        }
                    }
                }
                
                // 如果还是没找到，尝试从根节点按完整路径查找
                if (m_ItemTemplate == null)
                {
                    Transform root = transform.root;
                    Transform itemTemplate = root.Find("M_Panel/C_RiskData_Item");
                    if (itemTemplate != null)
                    {
                        m_ItemTemplate = itemTemplate.gameObject;
                        Debug.Log($"[C_RiskData_ScrollView] 从根节点找到模板: {itemTemplate.name}");
                    }
                    else
                    {
                        Debug.LogError("[C_RiskData_ScrollView] 无法找到C_RiskData_Item模板节点！");
                    }
                }
            }
            
            // 验证模板是否有正确的组件
            if (m_ItemTemplate != null)
            {
                var itemComponent = m_ItemTemplate.GetComponent<C_RiskData_Item>();
                if (itemComponent == null)
                {
                    // 如果模板没有C_RiskData_Item组件，添加一个
                    m_ItemTemplate.AddComponent<C_RiskData_Item>();
                    Debug.Log("[C_RiskData_ScrollView] 为模板添加了C_RiskData_Item组件");
                }
                else
                {
                    Debug.Log("[C_RiskData_ScrollView] 模板已有C_RiskData_Item组件");
                }
            }
            else
            {
                Debug.LogError("[C_RiskData_ScrollView] 模板对象为null，无法继续！");
            }
        }
        
        /// <summary>
        /// 配置滚动列表参数
        /// </summary>
        private void ConfigureScrollView()
        {
            if (m_ScrollView == null) 
            {
                Debug.LogError("[C_RiskData_ScrollView] 配置失败：滚动列表组件为null");
                return;
            }
            
            Debug.Log("[C_RiskData_ScrollView] 开始配置滚动列表...");
            
            // 基础配置
            m_ScrollView.m_Direction = e_Direction.Vertical;
            m_ScrollView.m_Row = 1; // 单列显示
            m_ScrollView.m_Spacing = m_ItemSpacing;
            m_ScrollView.m_CellGameObject = m_ItemTemplate;
            
            Debug.Log($"[C_RiskData_ScrollView] 基础配置完成 - 方向: {m_ScrollView.m_Direction}, 行数: {m_ScrollView.m_Row}, 间距: {m_ScrollView.m_Spacing}");
            Debug.Log($"[C_RiskData_ScrollView] 模板对象: {(m_ItemTemplate != null ? m_ItemTemplate.name : "null")}");
            
            // 性能优化配置
            m_ScrollView.SetMaxPoolSize(15);
            m_ScrollView.SetExtremeCacheMode(true); // 使用极致缓存模式
            
            // 动画配置
            m_ScrollView.m_EnableItemAnimation = true;
            m_ScrollView.m_OnlyAnimateFirstTime = true;
            m_ScrollView.m_AnimationDuration = 0.2f;
            m_ScrollView.m_AnimationOffset = 0.03f;
            
            // 隐藏模板
            if (m_ItemTemplate != null)
            {
                m_ItemTemplate.SetActive(false);
                Debug.Log("[C_RiskData_ScrollView] 模板对象已隐藏");
            }
            
            Debug.Log("[C_RiskData_ScrollView] 滚动列表配置完成");
        }
        
        /// <summary>
        /// 初始化滚动列表
        /// </summary>
        private void InitializeScrollView()
        {
            if (m_ScrollView == null) 
            {
                Debug.LogError("[C_RiskData_ScrollView] 初始化失败：滚动列表组件为null");
                return;
            }
            
            Debug.Log("[C_RiskData_ScrollView] 开始初始化滚动列表...");
            
            // 初始化滚动列表
            try
            {
                m_ScrollView.Init(OnUpdateListItem);
                Debug.Log("[C_RiskData_ScrollView] 滚动列表初始化成功");
            }
            catch (System.Exception e)
            {
                Debug.LogError($"[C_RiskData_ScrollView] 滚动列表初始化失败: {e.Message}");
            }
        }
        
        #endregion
        
        #region 数据管理方法
        
        /// <summary>
        /// 设置风险数据列表
        /// </summary>
        /// <param name="betDataList">押注数据列表</param>
        public void SetRiskDataList(List<NumberBetData> betDataList)
        {
            Debug.Log($"[C_RiskData_ScrollView] 设置风险数据列表，数据数量: {(betDataList != null ? betDataList.Count : 0)}");
            
            m_OriginalDataList = betDataList;
            
            // 过滤和排序数据
            FilterAndSortData();
            
            // 刷新列表
            RefreshList();
        }
        
        /// <summary>
        /// 过滤和排序数据
        /// </summary>
        private void FilterAndSortData()
        {
            if (m_OriginalDataList == null)
            {
                m_FilteredDataList = null;
                return;
            }
            
            // 显示所有49个号码的风险值，不进行过滤
            m_FilteredDataList = m_OriginalDataList.ToList();
            
            Debug.Log($"[C_RiskData_ScrollView] 风险数据列表数量: {m_FilteredDataList.Count}");
            
            // 自动排序
            if (m_AutoSort)
            {
                SortData();
            }
        }
        
        /// <summary>
        /// 排序数据
        /// </summary>
        private void SortData()
        {
            if (m_FilteredDataList == null || m_FilteredDataList.Count == 0)
                return;
            
            switch (m_SortType)
            {
                case RiskSortType.ByNumber:
                    m_FilteredDataList = m_SortDescending 
                        ? m_FilteredDataList.OrderByDescending(data => data.number).ToList()
                        : m_FilteredDataList.OrderBy(data => data.number).ToList();
                    break;
                    
                case RiskSortType.ByEatCode:
                    m_FilteredDataList = m_SortDescending 
                        ? m_FilteredDataList.OrderByDescending(data => data.selfBetAmount).ToList()
                        : m_FilteredDataList.OrderBy(data => data.selfBetAmount).ToList();
                    break;
                    
                case RiskSortType.ByRiskValue:
                    m_FilteredDataList = m_SortDescending 
                        ? m_FilteredDataList.OrderByDescending(data => data.riskValue).ToList()
                        : m_FilteredDataList.OrderBy(data => data.riskValue).ToList();
                    break;
            }
            
            Debug.Log($"[C_RiskData_ScrollView] 数据排序完成，排序类型: {m_SortType}, 降序: {m_SortDescending}");
        }
        
        /// <summary>
        /// 刷新整个列表
        /// </summary>
        public void RefreshList()
        {
            if (!m_IsInitialized || m_ScrollView == null)
            {
                Debug.LogWarning("[C_RiskData_ScrollView] 列表未初始化，无法刷新");
                return;
            }
            
            int itemCount = m_FilteredDataList != null ? m_FilteredDataList.Count : 0;
            Debug.Log($"[C_RiskData_ScrollView] 刷新列表，项目数量: {itemCount}");
            
            // 显示列表
            m_ScrollView.ShowList(itemCount);
        }
        
        /// <summary>
        /// 刷新风险数据（重新过滤和排序）
        /// </summary>
        public void RefreshRiskData()
        {
            Debug.Log("[C_RiskData_ScrollView] 刷新风险数据");
            
            // 重新过滤和排序
            FilterAndSortData();
            
            // 刷新列表显示
            RefreshList();
        }
        
        /// <summary>
        /// 滚动到指定号码
        /// </summary>
        /// <param name="number">号码</param>
        /// <param name="duration">滚动动画时间</param>
        public void ScrollToNumber(int number, float duration = 0.3f)
        {
            if (m_ScrollView == null || m_FilteredDataList == null)
                return;
            
            // 查找号码在过滤列表中的索引
            int itemIndex = -1;
            for (int i = 0; i < m_FilteredDataList.Count; i++)
            {
                if (m_FilteredDataList[i].number == number)
                {
                    itemIndex = i + 1; // 索引从1开始
                    break;
                }
            }
            
            if (itemIndex > 0)
            {
                m_ScrollView.ScrollToIndex(itemIndex, duration);
                Debug.Log($"[C_RiskData_ScrollView] 滚动到号码{number}，列表索引: {itemIndex}");
            }
            else
            {
                Debug.LogWarning($"[C_RiskData_ScrollView] 号码{number}不在当前风险列表中");
            }
        }
        
        #endregion
        
        #region 列表项更新回调
        
        /// <summary>
        /// 列表项更新回调
        /// </summary>
        /// <param name="itemObject">列表项GameObject</param>
        /// <param name="itemIndex">列表项索引（从1开始）</param>
        private void OnUpdateListItem(GameObject itemObject, int itemIndex)
        {
            Debug.Log($"[C_RiskData_ScrollView] 更新列表项 - 对象: {(itemObject != null ? itemObject.name : "null")}, 索引: {itemIndex}");
            
            if (itemObject == null || m_FilteredDataList == null)
            {
                Debug.LogWarning($"[C_RiskData_ScrollView] 更新列表项失败 - 对象为null: {itemObject == null}, 数据为null: {m_FilteredDataList == null}");
                return;
            }
            
            // 获取列表项组件
            C_RiskData_Item itemComponent = itemObject.GetComponent<C_RiskData_Item>();
            if (itemComponent == null)
            {
                itemComponent = itemObject.AddComponent<C_RiskData_Item>();
                Debug.Log($"[C_RiskData_ScrollView] 为列表项添加了C_RiskData_Item组件");
            }
            
            // 计算数据索引（从0开始）
            int dataIndex = itemIndex - 1;
            
            if (dataIndex >= 0 && dataIndex < m_FilteredDataList.Count)
            {
                NumberBetData betData = m_FilteredDataList[dataIndex];
                
                Debug.Log($"[C_RiskData_ScrollView] 更新列表项数据 - 号码: {betData.number}, 吃码: {betData.selfBetAmount}, 风险值: {betData.riskValue}");
                
                // 更新风险数据显示
                itemComponent.UpdateRiskData(betData);
                
                // 设置风险阈值（用于颜色显示）
                itemComponent.SetHighRiskThreshold(m_RiskThreshold);
                
                // 添加点击事件（如果需要）
                AddItemClickEvent(itemObject, betData);
            }
            else
            {
                Debug.LogWarning($"[C_RiskData_ScrollView] 数据索引超出范围: {dataIndex}, 数据数量: {m_FilteredDataList.Count}");
                
                // 清空显示
                itemComponent.UpdateRiskData(null);
            }
        }
        
        /// <summary>
        /// 添加列表项点击事件
        /// </summary>
        /// <param name="itemObject">列表项对象</param>
        /// <param name="betData">押注数据</param>
        private void AddItemClickEvent(GameObject itemObject, NumberBetData betData)
        {
            // 移除之前的点击事件
            Button button = itemObject.GetComponent<Button>();
            if (button == null)
            {
                button = itemObject.AddComponent<Button>();
            }
            
            // 清除之前的监听器
            button.onClick.RemoveAllListeners();
            
            // 添加新的点击事件
            button.onClick.AddListener(() => OnItemClicked(betData));
        }
        
        /// <summary>
        /// 列表项点击事件
        /// </summary>
        /// <param name="betData">押注数据</param>
        private void OnItemClicked(NumberBetData betData)
        {
            Debug.Log($"[C_RiskData_ScrollView] 点击风险项目 - 号码: {betData.number}, 风险值: {betData.riskValue}");
            
            // 触发外部回调
            m_OnItemSelected?.Invoke(betData);
        }
        
        #endregion
        
        #region 公共接口方法
        
        /// <summary>
        /// 设置风险阈值
        /// </summary>
        /// <param name="threshold">风险阈值</param>
        public void SetRiskThreshold(float threshold)
        {
            Debug.Log($"[C_RiskData_ScrollView] 设置风险阈值: {threshold}");
            
            m_RiskThreshold = threshold;
            
            // 重新过滤数据
            RefreshRiskData();
        }
        
        /// <summary>
        /// 设置排序类型
        /// </summary>
        /// <param name="sortType">排序类型</param>
        /// <param name="descending">是否降序</param>
        public void SetSortType(RiskSortType sortType, bool descending = false)
        {
            Debug.Log($"[C_RiskData_ScrollView] 设置排序类型: {sortType}, 降序: {descending}");
            
            m_SortType = sortType;
            m_SortDescending = descending;
            
            // 重新排序数据
            RefreshRiskData();
        }
        
        /// <summary>
        /// 设置项目选择回调
        /// </summary>
        /// <param name="callback">回调函数</param>
        public void SetItemSelectedCallback(Action<NumberBetData> callback)
        {
            m_OnItemSelected = callback;
        }
        
        /// <summary>
        /// 获取当前过滤后的数据列表
        /// </summary>
        /// <returns>过滤后的数据列表</returns>
        public List<NumberBetData> GetFilteredDataList()
        {
            return m_FilteredDataList;
        }
        
        /// <summary>
        /// 获取风险数据列表中的号码数量
        /// </summary>
        /// <returns>号码数量</returns>
        public int GetRiskDataCount()
        {
            return m_FilteredDataList != null ? m_FilteredDataList.Count : 0;
        }

        /// <summary>
        /// 获取高风险号码数量（风险值低于阈值的号码）
        /// </summary>
        /// <returns>高风险号码数量</returns>
        public int GetHighRiskCount()
        {
            if (m_FilteredDataList == null) return 0;
            return m_FilteredDataList.Count(data => data.riskValue < m_RiskThreshold);
        }
        
        /// <summary>
        /// 清空所有数据
        /// </summary>
        public void ClearAllData()
        {
            m_OriginalDataList = null;
            m_FilteredDataList = null;
            RefreshList();
        }
        
        /// <summary>
        /// 获取滚动列表组件
        /// </summary>
        /// <returns>滚动列表组件</returns>
        public EnhancedUICircularScrollView GetScrollView()
        {
            return m_ScrollView;
        }
        
        /// <summary>
        /// 调试信息 - 检查组件状态
        /// </summary>
        public void DebugComponentStatus()
        {
            Debug.Log($"=== C_RiskData_ScrollView 组件状态 ===");
            Debug.Log($"ScrollView组件: {(m_ScrollView != null ? "已找到" : "未找到")}");
            Debug.Log($"模板对象: {(m_ItemTemplate != null ? m_ItemTemplate.name : "未找到")}");
            Debug.Log($"是否已初始化: {m_IsInitialized}");
            Debug.Log($"原始数据: {(m_OriginalDataList != null ? $"已设置({m_OriginalDataList.Count}项)" : "未设置")}");
            Debug.Log($"过滤数据: {(m_FilteredDataList != null ? $"已过滤({m_FilteredDataList.Count}项)" : "未过滤")}");
            Debug.Log($"风险阈值: {m_RiskThreshold}");
            Debug.Log($"排序类型: {m_SortType}, 降序: {m_SortDescending}");
            
            if (m_ItemTemplate != null)
            {
                var itemComponent = m_ItemTemplate.GetComponent<C_RiskData_Item>();
                Debug.Log($"模板组件: {(itemComponent != null ? "已添加C_RiskData_Item" : "缺少C_RiskData_Item组件")}");
            }
        }
        
        #endregion
        
        #region Unity生命周期
        
        private void Awake()
        {
            // 在Awake中进行基础初始化
            FindComponents();
        }
        
        private void OnDestroy()
        {
            // 清理资源
            if (m_ScrollView != null)
            {
                m_ScrollView.DisposeAll();
            }
            
            m_OnItemSelected = null;
            m_OriginalDataList = null;
            m_FilteredDataList = null;
        }
        
        #endregion
    }
} 